let request = require('request');
const PAKO = require("./pako");
const BASE64=require('./Base64').Base64;
let BMOB=require("./bmob");
BMOB.initialize("e51c7b048ca58ee2", "J8&xt!");

function DataHelper() {
  this._T_DATA=[];
  this._DIRS={};
  this._sType="GET";
}

DoRequest=function(tOptions,pCallback){
  if(tOptions.method=="GET"){
    request.get(tOptions, function(err, response, body){
        if(err){
            if(pCallback){
              pCallback(err,body);
            }
        }else{
            if(pCallback){
              pCallback(null,body);
            }
        }
    });
  }
  else if(tOptions.method=="POST"){
      request.post(tOptions, function(err, response, body){
        if(err){
            if(pCallback){
              pCallback(err,body);
            }
        }else{
            if(pCallback){
              pCallback(err,body);
            }
        }
    });
  }
}

DataHelper.prototype.Init=function(pCallback){
  this._DIRS={};
  this.GetDirs((err,sResp)=>{
    if(!err){
      let tResp=JSON.parse(sResp);
      let tDirs=tResp.Dirs;
      for(let i in tDirs){
        let sDirName=tDirs[i];
        if(sDirName){
          this._DIRS[sDirName]=true;
        }
      }
      console.log("DIRS");
      console.log(this._DIRS)
      if(pCallback){
        pCallback(this._DIRS);
      }
    }else{
      console.log(err);
      console.log(tResp);
    }
  });
}

DataHelper.prototype.FileExists=function(sFileName){
  if(this._DIRS[sFileName]){
    return true;
  }
  return false;
}

DataHelper.prototype.Begin=function(sType){
  this._sType=sType;
}

DataHelper.prototype.GetData=function(tAttris,pCallback){
  // this._sType="GET";
  // this._T_DATA=tAttris;
  // this.Flush(pCallback);
  const query = Bmob.Query("g_data");
  query.equalTo("key","==", tAttris);
  query.find().then(res => {
      console.log(res)
  });
}

DataHelper.prototype.GetDirs=function(pCallback){
  this._sType="DIR";
  this._T_DATA=[];
  this.Flush(pCallback)
}

DataHelper.prototype.Clear=function(pCallback){
  this._sType="CLEAR";
  this._T_DATA=[];
  this._DIRS={};
  this.Flush(pCallback)
}

DataHelper.prototype.SetData=function(sAttri,data){
  let sData=JSON.stringify(data);
  let sCompressed=PAKO.deflate(sData, { to: 'string', gzip:true });
  let sSaveData=BASE64.btoa(sCompressed);
  this._T_DATA.push([sAttri,sSaveData]);
}

DataHelper.prototype.Flush=function(pCallback){
  let sType=this._sType;
  let tAllData=this._T_DATA;
  if(!tAllData){
    return;
  }
  if(sType=="SET"){
    for(let i=0;i<tAllData.length;i++){
      let tData=tAllData[i];
      if(tData){
        const query = Bmob.Query('g_data');
        query.set("key",tData[0])
        query.set("val",tData[1])
        query.save().then(res => {
          console.log(res)
        }).catch(err => {
          console.log(err)
        })
      }
    }
  }
  this._T_DATA=[];
}

// DataHelper.prototype.Flush=function(pCallback){
//   let tData=this._T_DATA;
//   let sType=this._sType;
//   let sURL = "https://data-server.now.sh/api/data"

//   let sBody=JSON.stringify({
//     Type:this._sType,
//     DATA:tData
//   });
//   let tOptions={
//       url:sURL,
//       method: 'GET',
//       headers:{
//           'Content-Type': 'application/json',
//           'Accept':'application/json'     
//       },
//       body:sBody 
//   }
//   this._T_DATA=[];
//   DoRequest(tOptions,(err,sResp)=>{
//     if(sType=="SET"){
//       if(!err){
//         let tResp=JSON.parse(sResp);
//         if(tResp&&tResp.OK){
//           for(let i=0;i<tData.length;i++){
//             let sAttri=tData[i][0];
//             if(sAttri){
//               this._DIRS[sAttri]=true;
//             }
//           }
//         }
//       }
//     }
//     if(pCallback){
//       if(sType=="GET"){
//         let tResp=JSON.parse(sResp);
//         let tData=tResp.Data;
//         for(let i in tData){
//           let sJson=PAKO.inflate(BASE64.atob(tData[i]),{gzip:true,to:'string'});
//           if(sJson){
//             tData[i]=JSON.parse(sJson);
//           }
//         }
//         pCallback(err,tData);
//       }else{
//         pCallback(err,sResp);
//       }
//     }
//   });
// }


DataHelper.prototype.DoQueryAdmob= function(tToken,sDate,pCallback){
  let sURL = "https://data-server.now.sh/api/query_admob"
  let tOptions={
      url:sURL,
      method: 'POST',
      headers:{
          'Content-Type': 'application/json',
          'Accept':'application/json'     
      },
      body:JSON.stringify({
          Date:sDate,
          tokens:tToken
      }) 
  }
  DoRequest(tOptions,(sErr,tBody)=>{
    pCallback(sErr,tBody);
  });
}

DataHelper.prototype.DoQueryFacebook= function(sDate,sToken,sID,pCallback){
  let sURL = "https://data-server.now.sh/api/query_facebook"
  let tOptions={
      url:sURL,
      method: 'POST',
      headers:{
          'Content-Type': 'application/json',
          'Accept':'application/json'     
      },
      body:JSON.stringify({
          Date:sDate,
          Token:sToken,
          ID:sID,
      }) 
  }
  DoRequest(tOptions,(sErr,sBody)=>{
    let tBody=JSON.parse(sBody);
    if(tBody){
      pCallback(tBody.Err,tBody.Data);
    }else{
      pCallback(sErr);
    }
  });
}

if(!global.__oDataHelper){
  global.__oDataHelper= new DataHelper();
}

module.exports = {
  Instance: global.__oDataHelper
}